package org.cnc.explain.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 * org.cnc.spring.explain.aop - PointCut
 *
 * @author tony-is-coding
 * @date 2022/7/1 14:27
 */
//@Aspect
//@Component
public class AopLogger {

	@Pointcut("execution(public * *(..))")
	public void anyPublic() {
		// 此 pointcut 匹配所有的公共方法
	}

	@Pointcut("within(org.cnc.spring.explain.aop..*)")
	public void anyInPackage() {
		// 此 pointcut 匹配所有的 指定包下的类的方法
	}

	@Pointcut("anyPublic() && anyInPackage()")
	public void publicInPackage() {
		// 此 pointcut 匹配所有的在指定包下的类的所有 `public` 方法
	}

	/**
	 * advise 执行拦截, 通过 @before @after @around 注解, 拦截指定的 pointcut匹配上的方法
	 * @param process
	 * @return
	 * @throws Throwable
	 */
	@Around("publicInPackage()")
	public Object advise(ProceedingJoinPoint process) throws Throwable {
		System.out.println("around before");
		Object ret = process.proceed();
		System.out.println("around after");
		return ret;
	}

}
